import isPromise from 'is-promise';
/**
 * storeAPI
 *   dispatch 现在指的是原生的dispatch
 *   getState
 * @param {*} param0 
 * @returns 
 */
function promise({ dispatch, getState }) {
    return function (next) {
        return function (action) {
            //如果派发的动作是一个Promise,则注册action成功的回调
            if (isPromise(action)) {
                //等Promise成功后则把成功的值传递给dispatch再次派发动作
                return action.then(value => dispatch(value))
            } else if (isPromise(action.payload)) {  //如果action.payload是一个Promise
                //等action.payload完成，如果成功了，会把结果 传递给result
                return action.payload.then(
                    result => {
                        //成功后会再次派发一个动作,action的类型不变，只是重写了payload为普通正数
                        return dispatch({ ...action, payload: result })
                    }
                ).catch(error => {
                    //如果失败了也会再次派发一个动作，action类型不变，只是重写了payload为普通正数
                    dispatch({ ...action, payload: error, error: true });
                    return Promise.reject(error);
                })
            } else {
                //再次派发的是一个普通对象，则走原始的store.dispatch，走reducer修改状态 
                return next(action);
            }
        }
    }
}
export default promise;